package com.ltmonitor.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;

import org.hibernate.Session;

import com.ltmonitor.dao.impl.QueryResult;

/**
 * Dao基础工具类接口
 * @author www.jt808.com
 *
 * @param <K>
 * @param <T>
 */
public interface IBaseHibernateDao<K extends Serializable ,T extends Serializable> {
	/**
	 * 由session工厂获取当前session对象
	 * @return
	 */
	public Session getSession();
	/**
	 * 将实体对象保存到数据库中
	 * @param t 待保存的实体对象
	 * @return 实体对象的ID
	 */
	public K save(T t);
	/**
	 * 将实体对象【集合】保存到数据库中
	 * @param ct 实体对象【集合】
	 */
	public void saveOrUpdateAll(Collection<T> ct);
	/**
	 * 根据Id查询实体对象
	 * @param id 表记录中的对应的id字段
	 * @return 对应的实体对象
	 */
	public T findById(K id);
	/**
	 * 更新一条记录
	 * @param t 待更新记录对应的实体对象
	 * @return 更新后的实体对象
	 */
	public T update(T t);
	/**
	 * 保存或更新一个实体对象到表记录中
	 * @param t 待更新的实体对象
	 * @return 更新后的实体对象
	 */
	public T saveOrUpdate(T t);
	/**
	 * 删除一个实体对象对应的表记录
	 * @param t 待删除的实体对象
	 */
	public void delete(T t);
	/**
	 * 删除一组记录
	 * @param ct 待删除记录集合
	 */
	public void deleteAll(Collection<T> ct);
	/**
	 * 根据id删除一条记录
	 * @param id 待删除记录id
	 * @return 是否删除成功（id是否有效）
	 */
	public boolean deleteById(K id);
	/**
	 * 分页加载记录集合
	 * @param page 当前第多少页
	 * @param rows 每页最多多少行数据
	 * @return 第page页的数据集合
	 */
	public QueryResult<T> load(int page,int rows);
	/**
	 * 获取总记录数
	 * @return 总数
	 */
	public long getTotalCount();
	

	/**
	 * 加载所有记录集合
	 * @return 所有记录集合
	 */
	public Collection<T> loadAll();
	
	/******************************HQL******************************/
	/**
	 * 分页获取所有记录
	 * @return
	 */
	public QueryResult<T> getScrollData();
	/**
	 * 分页获取记录
	 * @param firstResult 开始索引,如果输入值为-1,即获取全部数据
	 * @param maxResult 每页获取的记录数,如果输入值为-1,即获取全部数据
	 * @return
	 */
	public QueryResult<T> getScrollData(int firstResult, int maxResult);
	/**
	 * 分页获取记录
	 * @param firstResult 开始索引,如果输入值为-1,即获取全部数据
	 * @param maxResult 每页获取的记录数,如果输入值为-1,即获取全部数据
	 * @param orderby 排序,Key为排序属性,Value为asc/desc,如:
	 *  LinkedHashMap<String, String> orderby = new LinkedHashMap<String, String>();
		orderby.put("email", "asc");
		orderby.put("password", "desc");
	 * @return
	 */
	public QueryResult<T> getScrollData(int firstResult, int maxResult, LinkedHashMap<String, String> orderby);
	/**
	 * 分页获取记录
	 * @param firstResult 开始索引,如果输入值为-1,即获取全部数据
	 * @param maxResult 每页获取的记录数,如果输入值为-1,即获取全部数据
	 * @param where 条件语句,不带where关键字,条件语句只能使用位置参数,位置参数的索引值以1开始,如:o.username=?1 and o.password=?2
	 * @param params 条件语句出现的位置参数值
	 * @return
	 */
	public QueryResult<T> getScrollData(int firstResult, int maxResult, String where, Object[] params);
	/**
	 * 分页获取记录
	 * @param firstResult 开始索引,如果输入值为-1,即获取全部数据
	 * @param maxResult 每页获取的记录数,如果输入值为-1,即获取全部数据
	 * @param where 条件语句,不带where关键字,条件语句只能使用位置参数,位置参数的索引值以1开始,如:o.username=?1 and o.password=?2
	 * @param params 条件语句出现的位置参数值
	 * @param orderby 排序,Key为排序属性,Value为asc/desc,如:
	 *  LinkedHashMap<String, String> orderby = new LinkedHashMap<String, String>();
		orderby.put("email", "asc");
		orderby.put("password", "desc");
	 * @return
	 */
	public QueryResult<T> getScrollData(int firstResult, int maxResult, String where, Object[] params, LinkedHashMap<String, String> orderby);
	/**
	 * 根据实体类主键ID进行假删除
	 * @param id
	 * @return
	 */
	public  boolean deleteFakeById(K id);
	/**
	 * 假删除实体类对象
	 * @param t
	 */
	public  void deleteFake(T t);
	/**
	 * 根据hql，查询，返回集合类型数据
	 * @param hql
	 * @param value 查询参数
	 * @return
	 */
	public  List<T> query(final String hql, final Object value);
	/**
	 * 根据hql，查询，返回集合类型数据
	 * @param hql
	 * @param values
	 * @return
	 */
	public  List<T> query(final String hql, final Object[] values);
	/**
	 * 制定参数名称进行查询
	 * @param hql
	 * @param paramName
	 * @param value
	 * @return
	 */
	public  List<T> queryByNamedParam(final String hql, String paramName,
			final Object value);

	public List<T> queryByNamedParam(String hql, String paramName, Object[] value);
	
	/**
	 * 根据hql，查询，返回集合类型数据
	 * @param hql
	 * @return
	 */
	public  List<T> query(final String hql);
	/**
	 * 根据hql，查询，返回唯一结果
	 * @param hsql
	 * @param values
	 * @return
	 */
	public  T find(String hsql, Object[] values);
	/**
	 * 根据hql，查询，返回唯一结果
	 * @param hsql
	 * @param value
	 * @return
	 */
	public  T find(String hsql, Object value);
	/**
	 * 根据hql，查询，返回唯一结果
	 * @param hsql
	 * @return
	 */
	public  T find(String hsql);
	/**
	 * 根据HQL语句和传参，批量更新数据库，注意hql是update .. set ..开始的语句，不是查询语句
	 * @param hql hql是update .. set ..开始的语句，不是查询语句
	 * @param values 要更新的参数值
	 */
	void bulkUpdate(String hql, Object[] values);

}
